(function($) {
	$.Jcrop = function(obj, opt) {
		var obj = obj,
			opt = opt;
		if (typeof(obj) !== "object") {
			obj = $(obj)[0]
		}
		if (typeof(opt) !== "object") {
			opt = {}
		}
		if (!("trackDocument" in opt)) {
			opt.trackDocument = $.browser.msie ? false : true;
			if ($.browser.msie && $.browser.version.split(".")[0] == "8") {
				opt.trackDocument = true
			}
		}
		if (!("keySupport" in opt)) {
			opt.keySupport = $.browser.msie ? false : true
		}
		var defaults = {
			trackDocument: false,
			baseClass: "jcrop",
			addClass: null,
			bgColor: "black",
			bgOpacity: 0.6,
			borderOpacity: 0.4,
			handleOpacity: 0.5,
			handlePad: 5,
			handleSize: 9,
			handleOffset: 5,
			edgeMargin: 14,
			aspectRatio: 0,
			keySupport: true,
			cornerHandles: true,
			sideHandles: true,
			drawBorders: true,
			dragEdges: true,
			boxWidth: 0,
			boxHeight: 0,
			boundary: 8,
			animationDelay: 20,
			swingSpeed: 3,
			allowSelect: true,
			allowMove: true,
			allowResize: true,
			minSelect: [0, 0],
			maxSize: [0, 0],
			minSize: [0, 0],
			onChange: function() {},
			onSelect: function() {}
		};
		var options = defaults;
		setOptions(opt);
		var $origimg = $(obj);
		var $img = $origimg.clone()
			.removeAttr("id")
			.css({
				position: "absolute"
			});
		$img.width($origimg.width());
		$img.height($origimg.height());
		$origimg.after($img)
			.hide();
		presize($img, options.boxWidth, options.boxHeight);
		var boundx = $img.width(),
			boundy = $img.height(),
			$div = $("<div />")
			.width(boundx)
			.height(boundy)
			.addClass(cssClass("holder"))
			.css({
				position: "relative",
				backgroundColor: options.bgColor
			})
			.insertAfter($origimg)
			.append($img);
		if (options.addClass) {
			$div.addClass(options.addClass)
		}
		var $img2 = $("<img />")
			.attr("src", $img.attr("src"))
			.css("position", "absolute")
			.width(boundx)
			.height(boundy);
		var $img_holder = $("<div />")
			.width(pct(100))
			.height(pct(100))
			.css({
				zIndex: 310,
				position: "absolute",
				overflow: "hidden"
			})
			.append($img2);
		var $hdl_holder = $("<div />")
			.width(pct(100))
			.height(pct(100))
			.css("zIndex", 320);
		var $sel = $("<div />")
			.css({
				position: "absolute",
				zIndex: 300
			})
			.insertBefore($img)
			.append($img_holder, $hdl_holder);
		var bound = options.boundary;
		var $trk = newTracker()
			.width(boundx + (bound * 2))
			.height(boundy + (bound * 2))
			.css({
				position: "absolute",
				top: px(-bound),
				left: px(-bound),
				zIndex: 290
			})
			.mousedown(newSelection);
		var xlimit, ylimit, xmin, ymin;
		var xscale, yscale, enabled = true;
		var docOffset = getPos($img),
			btndown, lastcurs, dimmed, animating, shift_down;
		var Coords = function() {
			var x1 = 0,
				y1 = 0,
				x2 = 0,
				y2 = 0,
				ox, oy;

			function setPressed(pos) {
				var pos = rebound(pos);
				x2 = x1 = pos[0];
				y2 = y1 = pos[1]
			}

			function setCurrent(pos) {
				var pos = rebound(pos);
				ox = pos[0] - x2;
				oy = pos[1] - y2;
				x2 = pos[0];
				y2 = pos[1]
			}

			function getOffset() {
				return [ox, oy]
			}

			function moveOffset(offset) {
				var ox = offset[0],
					oy = offset[1];
				if (0 > x1 + ox) {
					ox -= ox + x1
				}
				if (0 > y1 + oy) {
					oy -= oy + y1
				}
				if (boundy < y2 + oy) {
					oy += boundy - (y2 + oy)
				}
				if (boundx < x2 + ox) {
					ox += boundx - (x2 + ox)
				}
				x1 += ox;
				x2 += ox;
				y1 += oy;
				y2 += oy
			}

			function getCorner(ord) {
				var c = getFixed();
				switch (ord) {
					case "ne":
						return [c.x2, c.y];
					case "nw":
						return [c.x, c.y];
					case "se":
						return [c.x2, c.y2];
					case "sw":
						return [c.x, c.y2]
				}
			}

			function getFixed() {
				if (!options.aspectRatio) {
					return getRect()
				}
				var aspect = options.aspectRatio,
					min_x = options.minSize[0] / xscale,
					min_y = options.minSize[1] / yscale,
					max_x = options.maxSize[0] / xscale,
					max_y = options.maxSize[1] / yscale,
					rw = x2 - x1,
					rh = y2 - y1,
					rwa = Math.abs(rw),
					rha = Math.abs(rh),
					real_ratio = rwa / rha,
					xx, yy;
				if (max_x == 0) {
					max_x = boundx * 10
				}
				if (max_y == 0) {
					max_y = boundy * 10
				}
				if (real_ratio < aspect) {
					yy = y2;
					w = rha * aspect;
					xx = rw < 0 ? x1 - w : w + x1;
					if (xx < 0) {
						xx = 0;
						h = Math.abs((xx - x1) / aspect);
						yy = rh < 0 ? y1 - h : h + y1
					} else {
						if (xx > boundx) {
							xx = boundx;
							h = Math.abs((xx - x1) / aspect);
							yy = rh < 0 ? y1 - h : h + y1
						}
					}
				} else {
					xx = x2;
					h = rwa / aspect;
					yy = rh < 0 ? y1 - h : y1 + h;
					if (yy < 0) {
						yy = 0;
						w = Math.abs((yy - y1) * aspect);
						xx = rw < 0 ? x1 - w : w + x1
					} else {
						if (yy > boundy) {
							yy = boundy;
							w = Math.abs(yy - y1) * aspect;
							xx = rw < 0 ? x1 - w : w + x1
						}
					}
				}
				if (xx > x1) {
					if (xx - x1 < min_x) {
						xx = x1 + min_x
					} else {
						if (xx - x1 > max_x) {
							xx = x1 + max_x
						}
					}
					if (yy > y1) {
						yy = y1 + (xx - x1) / aspect
					} else {
						yy = y1 - (xx - x1) / aspect
					}
				} else {
					if (xx < x1) {
						if (x1 - xx < min_x) {
							xx = x1 - min_x
						} else {
							if (x1 - xx > max_x) {
								xx = x1 - max_x
							}
						}
						if (yy > y1) {
							yy = y1 + (x1 - xx) / aspect
						} else {
							yy = y1 - (x1 - xx) / aspect
						}
					}
				}
				if (xx < 0) {
					x1 -= xx;
					xx = 0
				} else {
					if (xx > boundx) {
						x1 -= xx - boundx;
						xx = boundx
					}
				}
				if (yy < 0) {
					y1 -= yy;
					yy = 0
				} else {
					if (yy > boundy) {
						y1 -= yy - boundy;
						yy = boundy
					}
				}
				return last = makeObj(flipCoords(x1, y1, xx, yy))
			}

			function rebound(p) {
				if (p[0] < 0) {
					p[0] = 0
				}
				if (p[1] < 0) {
					p[1] = 0
				}
				if (p[0] > boundx) {
					p[0] = boundx
				}
				if (p[1] > boundy) {
					p[1] = boundy
				}
				return [p[0], p[1]]
			}

			function flipCoords(x1, y1, x2, y2) {
				var xa = x1,
					xb = x2,
					ya = y1,
					yb = y2;
				if (x2 < x1) {
					xa = x2;
					xb = x1
				}
				if (y2 < y1) {
					ya = y2;
					yb = y1
				}
				return [Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb)]
			}

			function getRect() {
				var xsize = x2 - x1;
				var ysize = y2 - y1;
				if (xlimit && (Math.abs(xsize) > xlimit)) {
					x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit)
				}
				if (ylimit && (Math.abs(ysize) > ylimit)) {
					y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit)
				}
				if (ymin && (Math.abs(ysize) < ymin)) {
					y2 = (ysize > 0) ? (y1 + ymin) : (y1 - ymin)
				}
				if (xmin && (Math.abs(xsize) < xmin)) {
					x2 = (xsize > 0) ? (x1 + xmin) : (x1 - xmin)
				}
				if (x1 < 0) {
					x2 -= x1;
					x1 -= x1
				}
				if (y1 < 0) {
					y2 -= y1;
					y1 -= y1
				}
				if (x2 < 0) {
					x1 -= x2;
					x2 -= x2
				}
				if (y2 < 0) {
					y1 -= y2;
					y2 -= y2
				}
				if (x2 > boundx) {
					var delta = x2 - boundx;
					x1 -= delta;
					x2 -= delta
				}
				if (y2 > boundy) {
					var delta = y2 - boundy;
					y1 -= delta;
					y2 -= delta
				}
				if (x1 > boundx) {
					var delta = x1 - boundy;
					y2 -= delta;
					y1 -= delta
				}
				if (y1 > boundy) {
					var delta = y1 - boundy;
					y2 -= delta;
					y1 -= delta
				}
				return makeObj(flipCoords(x1, y1, x2, y2))
			}

			function makeObj(a) {
				return {
					x: a[0],
					y: a[1],
					x2: a[2],
					y2: a[3],
					w: a[2] - a[0],
					h: a[3] - a[1]
				}
			}
			return {
				flipCoords: flipCoords,
				setPressed: setPressed,
				setCurrent: setCurrent,
				getOffset: getOffset,
				moveOffset: moveOffset,
				getCorner: getCorner,
				getFixed: getFixed
			}
		}();
		var Selection = function() {
			var start, end, dragmode, awake, hdep = 370;
			var borders = {};
			var handle = {};
			var seehandles = false;
			var hhs = options.handleOffset;
			if (options.drawBorders) {
				borders = {
					top: insertBorder("hline")
						.css("top", $.browser.msie ? px(-1) : px(0)),
					bottom: insertBorder("hline"),
					left: insertBorder("vline"),
					right: insertBorder("vline")
				}
			}
			if (options.dragEdges) {
				handle.t = insertDragbar("n");
				handle.b = insertDragbar("s");
				handle.r = insertDragbar("e");
				handle.l = insertDragbar("w")
			}
			options.sideHandles && createHandles(["n", "s", "e", "w"]);
			options.cornerHandles && createHandles(["sw", "nw", "ne", "se"]);

			function insertBorder(type) {
				var jq = $("<div />")
					.css({
						position: "absolute",
						opacity: options.borderOpacity
					})
					.addClass(cssClass(type));
				$img_holder.append(jq);
				return jq
			}

			function dragDiv(ord, zi) {
				var jq = $("<div />")
					.mousedown(createDragger(ord))
					.css({
						cursor: ord + "-resize",
						position: "absolute",
						zIndex: zi
					});
				$hdl_holder.append(jq);
				return jq
			}

			function insertHandle(ord) {
				return dragDiv(ord, hdep++)
					.css({
						top: px(-hhs + 1),
						left: px(-hhs + 1),
						opacity: options.handleOpacity
					})
					.addClass(cssClass("handle"))
			}

			function insertDragbar(ord) {
				var s = options.handleSize,
					o = hhs,
					h = s,
					w = s,
					t = o,
					l = o;
				switch (ord) {
					case "n":
					case "s":
						w = pct(100);
						break;
					case "e":
					case "w":
						h = pct(100);
						break
				}
				return dragDiv(ord, hdep++)
					.width(w)
					.height(h)
					.css({
						top: px(-t + 1),
						left: px(-l + 1)
					})
			}

			function createHandles(li) {
				for (i in li) {
					handle[li[i]] = insertHandle(li[i])
				}
			}

			function moveHandles(c) {
				var midvert = Math.round((c.h / 2) - hhs),
					midhoriz = Math.round((c.w / 2) - hhs),
					north = west = -hhs + 1,
					east = c.w - hhs,
					south = c.h - hhs,
					x, y;
				"e" in handle && handle.e.css({
					top: px(midvert),
					left: px(east)
				}) && handle.w.css({
					top: px(midvert)
				}) && handle.s.css({
					top: px(south),
					left: px(midhoriz)
				}) && handle.n.css({
					left: px(midhoriz)
				});
				"ne" in handle && handle.ne.css({
					left: px(east)
				}) && handle.se.css({
					top: px(south),
					left: px(east)
				}) && handle.sw.css({
					top: px(south)
				});
				"b" in handle && handle.b.css({
					top: px(south)
				}) && handle.r.css({
					left: px(east)
				})
			}

			function moveto(x, y) {
				$img2.css({
					top: px(-y),
					left: px(-x)
				});
				$sel.css({
					top: px(y),
					left: px(x)
				})
			}

			function resize(w, h) {
				$sel.width(w)
					.height(h)
			}

			function refresh() {
				var c = Coords.getFixed();
				Coords.setPressed([c.x, c.y]);
				Coords.setCurrent([c.x2, c.y2]);
				updateVisible()
			}

			function updateVisible() {
				if (awake) {
					return update()
				}
			}

			function update() {
				var c = Coords.getFixed();
				resize(c.w, c.h);
				moveto(c.x, c.y);
				options.drawBorders && borders["right"].css({
					left: px(c.w - 1)
				}) && borders["bottom"].css({
					top: px(c.h - 1)
				});
				seehandles && moveHandles(c);
				awake || show();
				options.onChange(unscale(c))
			}

			function show() {
				$sel.show();
				$img.css("opacity", options.bgOpacity);
				awake = true
			}

			function release() {
				disableHandles();
				$sel.hide();
				$img.css("opacity", 1);
				awake = false
			}

			function showHandles() {
				if (seehandles) {
					moveHandles(Coords.getFixed());
					$hdl_holder.show()
				}
			}

			function enableHandles() {
				seehandles = true;
				if (options.allowResize) {
					moveHandles(Coords.getFixed());
					$hdl_holder.show();
					return true
				}
			}

			function disableHandles() {
				seehandles = false;
				$hdl_holder.hide()
			}

			function animMode(v) {
				(animating = v) ? disableHandles(): enableHandles()
			}

			function done() {
				animMode(false);
				refresh()
			}
			var $track = newTracker()
				.mousedown(createDragger("move"))
				.css({
					cursor: "move",
					position: "absolute",
					zIndex: 360
				});
			$img_holder.append($track);
			disableHandles();
			return {
				updateVisible: updateVisible,
				update: update,
				release: release,
				refresh: refresh,
				setCursor: function(cursor) {
					$track.css("cursor", cursor)
				},
				enableHandles: enableHandles,
				enableOnly: function() {
					seehandles = true
				},
				showHandles: showHandles,
				disableHandles: disableHandles,
				animMode: animMode,
				done: done
			}
		}();
		var Tracker = function() {
			var onMove = function() {},
				onDone = function() {},
				trackDoc = options.trackDocument;
			if (!trackDoc) {
				$trk.mousemove(trackMove)
					.mouseup(trackUp)
					.mouseout(trackUp)
			}

			function toFront() {
				$trk.css({
					zIndex: 450
				});
				if (trackDoc) {
					$(document)
						.mousemove(trackMove)
						.mouseup(trackUp)
				}
			}

			function toBack() {
				$trk.css({
					zIndex: 290
				});
				if (trackDoc) {
					$(document)
						.unbind("mousemove", trackMove)
						.unbind("mouseup", trackUp)
				}
			}

			function trackMove(e) {
				onMove(mouseAbs(e))
			}

			function trackUp(e) {
				e.preventDefault();
				e.stopPropagation();
				if (btndown) {
					btndown = false;
					onDone(mouseAbs(e));
					options.onSelect(unscale(Coords.getFixed()));
					toBack();
					onMove = function() {};
					onDone = function() {}
				}
				return false
			}

			function activateHandlers(move, done) {
				btndown = true;
				onMove = move;
				onDone = done;
				toFront();
				return false
			}

			function setCursor(t) {
				$trk.css("cursor", t)
			}
			$img.before($trk);
			return {
				activateHandlers: activateHandlers,
				setCursor: setCursor
			}
		}();
		var KeyManager = function() {
			var $keymgr = $('<input type="radio" />')
				.css({
					position: "absolute",
					left: "-30px"
				})
				.keypress(parseKey)
				.blur(onBlur),
				$keywrap = $("<div />")
				.css({
					position: "absolute",
					overflow: "hidden"
				})
				.append($keymgr);

			function watchKeys() {
				if (options.keySupport) {
					$keymgr.show();
					$keymgr.focus()
				}
			}

			function onBlur(e) {
				$keymgr.hide()
			}

			function doNudge(e, x, y) {
				if (options.allowMove) {
					Coords.moveOffset([x, y]);
					Selection.updateVisible()
				}
				e.preventDefault();
				e.stopPropagation()
			}

			function parseKey(e) {
				if (e.ctrlKey) {
					return true
				}
				shift_down = e.shiftKey ? true : false;
				var nudge = shift_down ? 10 : 1;
				switch (e.keyCode) {
					case 37:
						doNudge(e, -nudge, 0);
						break;
					case 39:
						doNudge(e, nudge, 0);
						break;
					case 38:
						doNudge(e, 0, -nudge);
						break;
					case 40:
						doNudge(e, 0, nudge);
						break;
					case 27:
						Selection.release();
						break;
					case 9:
						return true
				}
				return nothing(e)
			}
			if (options.keySupport) {
				$keywrap.insertBefore($img)
			}
			return {
				watchKeys: watchKeys
			}
		}();

		function px(n) {
			return "" + parseInt(n) + "px"
		}

		function pct(n) {
			return "" + parseInt(n) + "%"
		}

		function cssClass(cl) {
			return options.baseClass + "-" + cl
		}

		function getPos(obj) {
			var pos = $(obj)
				.offset();
			return [pos.left, pos.top]
		}

		function mouseAbs(e) {
			return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])]
		}

		function myCursor(type) {
			if (type != lastcurs) {
				Tracker.setCursor(type);
				lastcurs = type
			}
		}

		function startDragMode(mode, pos) {
			docOffset = getPos($img);
			Tracker.setCursor(mode == "move" ? mode : mode + "-resize");
			if (mode == "move") {
				return Tracker.activateHandlers(createMover(pos), doneSelect)
			}
			var fc = Coords.getFixed();
			var opp = oppLockCorner(mode);
			var opc = Coords.getCorner(oppLockCorner(opp));
			Coords.setPressed(Coords.getCorner(opp));
			Coords.setCurrent(opc);
			Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect)
		}

		function dragmodeHandler(mode, f) {
			return function(pos) {
				if (!options.aspectRatio) {
					switch (mode) {
						case "e":
							pos[1] = f.y2;
							break;
						case "w":
							pos[1] = f.y2;
							break;
						case "n":
							pos[0] = f.x2;
							break;
						case "s":
							pos[0] = f.x2;
							break
					}
				} else {
					switch (mode) {
						case "e":
							pos[1] = f.y + 1;
							break;
						case "w":
							pos[1] = f.y + 1;
							break;
						case "n":
							pos[0] = f.x + 1;
							break;
						case "s":
							pos[0] = f.x + 1;
							break
					}
				}
				Coords.setCurrent(pos);
				Selection.update()
			}
		}

		function createMover(pos) {
			var lloc = pos;
			KeyManager.watchKeys();
			return function(pos) {
				Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);
				lloc = pos;
				Selection.update()
			}
		}

		function oppLockCorner(ord) {
			switch (ord) {
				case "n":
					return "sw";
				case "s":
					return "nw";
				case "e":
					return "nw";
				case "w":
					return "ne";
				case "ne":
					return "sw";
				case "nw":
					return "se";
				case "se":
					return "nw";
				case "sw":
					return "ne"
			}
		}

		function createDragger(ord) {
			return function(e) {
				if (options.disabled) {
					return false
				}
				if ((ord == "move") && !options.allowMove) {
					return false
				}
				btndown = true;
				startDragMode(ord, mouseAbs(e));
				e.stopPropagation();
				e.preventDefault();
				return false
			}
		}

		function presize($obj, w, h) {
			var nw = $obj.width(),
				nh = $obj.height();
			if ((nw > w) && w > 0) {
				nw = w;
				nh = (w / $obj.width()) * $obj.height()
			}
			if ((nh > h) && h > 0) {
				nh = h;
				nw = (h / $obj.height()) * $obj.width()
			}
			xscale = $obj.width() / nw;
			yscale = $obj.height() / nh;
			$obj.width(nw)
				.height(nh)
		}

		function unscale(c) {
			return {
				x: parseInt(c.x * xscale),
				y: parseInt(c.y * yscale),
				x2: parseInt(c.x2 * xscale),
				y2: parseInt(c.y2 * yscale),
				w: parseInt(c.w * xscale),
				h: parseInt(c.h * yscale)
			}
		}

		function doneSelect(pos) {
			var c = Coords.getFixed();
			if (c.w > options.minSelect[0] && c.h > options.minSelect[1]) {
				Selection.enableHandles();
				Selection.done()
			} else {
				Selection.release()
			}
			Tracker.setCursor(options.allowSelect ? "crosshair" : "default")
		}

		function newSelection(e) {
			if (options.disabled) {
				return false
			}
			if (!options.allowSelect) {
				return false
			}
			btndown = true;
			docOffset = getPos($img);
			Selection.disableHandles();
			myCursor("crosshair");
			var pos = mouseAbs(e);
			Coords.setPressed(pos);
			Tracker.activateHandlers(selectDrag, doneSelect);
			KeyManager.watchKeys();
			Selection.update();
			e.stopPropagation();
			e.preventDefault();
			return false
		}

		function selectDrag(pos) {
			Coords.setCurrent(pos);
			Selection.update()
		}

		function newTracker() {
			var trk = $("<div></div>")
				.addClass(cssClass("tracker"));
			$.browser.msie && trk.css({
				opacity: 0,
				backgroundColor: "white"
			});
			return trk
		}

		function animateTo(a) {
			var x1 = a[0] / xscale,
				y1 = a[1] / yscale,
				x2 = a[2] / xscale,
				y2 = a[3] / yscale;
			if (animating) {
				return
			}
			var animto = Coords.flipCoords(x1, y1, x2, y2);
			var c = Coords.getFixed();
			var animat = initcr = [c.x, c.y, c.x2, c.y2];
			var interv = options.animationDelay;
			var x = animat[0];
			var y = animat[1];
			var x2 = animat[2];
			var y2 = animat[3];
			var ix1 = animto[0] - initcr[0];
			var iy1 = animto[1] - initcr[1];
			var ix2 = animto[2] - initcr[2];
			var iy2 = animto[3] - initcr[3];
			var pcent = 0;
			var velocity = options.swingSpeed;
			Selection.animMode(true);
			var animator = function() {
				return function() {
					pcent += (100 - pcent) / velocity;
					animat[0] = x + ((pcent / 100) * ix1);
					animat[1] = y + ((pcent / 100) * iy1);
					animat[2] = x2 + ((pcent / 100) * ix2);
					animat[3] = y2 + ((pcent / 100) * iy2);
					if (pcent < 100) {
						animateStart()
					} else {
						Selection.done()
					}
					if (pcent >= 99.8) {
						pcent = 100
					}
					setSelectRaw(animat)
				}
			}();

			function animateStart() {
				window.setTimeout(animator, interv)
			}
			animateStart()
		}

		function setSelect(rect) {
			setSelectRaw([rect[0] / xscale, rect[1] / yscale, rect[2] / xscale, rect[3] / yscale])
		}

		function setSelectRaw(l) {
			Coords.setPressed([l[0], l[1]]);
			Coords.setCurrent([l[2], l[3]]);
			Selection.update()
		}

		function setOptions(opt) {
			if (typeof(opt) != "object") {
				opt = {}
			}
			options = $.extend(options, opt);
			if (typeof(options.onChange) !== "function") {
				options.onChange = function() {}
			}
			if (typeof(options.onSelect) !== "function") {
				options.onSelect = function() {}
			}
		}

		function tellSelect() {
			return unscale(Coords.getFixed())
		}

		function tellScaled() {
			return Coords.getFixed()
		}

		function setOptionsNew(opt) {
			setOptions(opt);
			interfaceUpdate()
		}

		function disableCrop() {
			options.disabled = true;
			Selection.disableHandles();
			Selection.setCursor("default");
			Tracker.setCursor("default")
		}

		function enableCrop() {
			options.disabled = false;
			interfaceUpdate()
		}

		function cancelCrop() {
			Selection.done();
			Tracker.activateHandlers(null, null)
		}

		function destroy() {
			$div.remove();
			$origimg.show()
		}

		function interfaceUpdate(alt) {
			options.allowResize ? alt ? Selection.enableOnly() : Selection.enableHandles() : Selection.disableHandles();
			Tracker.setCursor(options.allowSelect ? "crosshair" : "default");
			Selection.setCursor(options.allowMove ? "move" : "default");
			$div.css("backgroundColor", options.bgColor);
			if ("setSelect" in options) {
				setSelect(opt.setSelect);
				Selection.done();
				delete(options.setSelect)
			}
			if ("trueSize" in options) {
				xscale = options.trueSize[0] / boundx;
				yscale = options.trueSize[1] / boundy
			}
			xlimit = options.maxSize[0] || 0;
			ylimit = options.maxSize[1] || 0;
			xmin = options.minSize[0] || 0;
			ymin = options.minSize[1] || 0;
			if ("outerImage" in options) {
				$img.attr("src", options.outerImage);
				delete(options.outerImage)
			}
			Selection.refresh()
		}
		$hdl_holder.hide();
		interfaceUpdate(true);
		var api = {
			animateTo: animateTo,
			setSelect: setSelect,
			setOptions: setOptionsNew,
			tellSelect: tellSelect,
			tellScaled: tellScaled,
			disable: disableCrop,
			enable: enableCrop,
			cancel: cancelCrop,
			focus: KeyManager.watchKeys,
			getBounds: function() {
				return [boundx * xscale, boundy * yscale]
			},
			getWidgetSize: function() {
				return [boundx, boundy]
			},
			release: Selection.release,
			destroy: destroy
		};
		$origimg.data("Jcrop", api);
		return api
	};
	$.fn.Jcrop = function(options) {
		function attachWhenDone(from) {
			var loadsrc = options.useImg || from.src;
			var img = new Image();
			img.onload = function() {
				$.Jcrop(from, options)
			};
			img.src = loadsrc
		}
		if (typeof(options) !== "object") {
			options = {}
		}
		this.each(function() {
			if ($(this)
				.data("Jcrop")) {
				if (options == "api") {
					return $(this)
						.data("Jcrop")
				} else {
					$(this)
						.data("Jcrop")
						.setOptions(options)
				}
			} else {
				attachWhenDone(this)
			}
		});
		return this
	}
})(jQuery);
(function($, undefined) {
	$.fn.zyPopup = function(options, param) {
		var otherArgs = Array.prototype.slice.call(arguments, 1);
		if (typeof options == "string") {
			var fn = this[0][options];
			if ($.isFunction(fn)) {
				return fn.apply(this, otherArgs)
			} else {
				throw ("zyPopup - No such method: " + options)
			}
		}
		return this.each(function() {
			var para = {};
			var self = this;
			var zoom = "",
				zoomContent = "",
				zoomedIn = false,
				openedImage = null,
				windowWidth = "",
				windowHeight = "";
			var tailorVal = {};
			var defaults = {
				src: "",
				index: 0,
				name: "",
				onTailor: function(val) {}
			};
			para = $.extend(defaults, options);
			this.init = function() {
				this.createHtml();
				this.openPopup();
				this.bindPopupEvent()
			};
			this.createHtml = function() {
				$("#zoom")
					.remove();
				$("body")
					.append('<div id="zoom"><a class="finish"></a><a class="close"></a><div class="content loading"></div></div>');
				zoom = $("#zoom")
					.hide(), zoomContent = $("#zoom .content"), zoomedIn = false, openedImage = null, windowWidth = $(window)
					.width(), windowHeight = $(window)
					.height()
			};
			this.openPopup = function() {
				var self = this;
				var image = $(new Image())
					.attr("id", "tailorImg")
					.hide();
				$("#zoom .previous, #zoom .next")
					.show();
				if (!zoomedIn) {
					zoomedIn = true;
					zoom.show();
					$("body")
						.addClass("zoomed")
				}
				zoomContent.html(image)
					.delay(500)
					.addClass("loading");
				image.load(render)
					.attr("src", para.src);

				function render() {
					var image = $(this),
						borderWidth = parseInt(zoomContent.css("borderLeftWidth")),
						maxImageWidth = windowWidth - (borderWidth * 2),
						maxImageHeight = windowHeight - (borderWidth * 2),
						imageWidth = image.width(),
						imageHeight = image.height();
					if (imageWidth == zoomContent.width() && imageWidth <= maxImageWidth && imageHeight == zoomContent.height() && imageHeight <= maxImageHeight) {
						show(image);
						return
					}
					zoomContent.animate({
						width: image.width(),
						height: image.height(),
						marginTop: -(image.height() / 2) - borderWidth,
						marginLeft: -(image.width() / 2) - borderWidth
					}, 200, function() {
						show(image)
					});

					function show(image) {
						image.show();
						zoomContent.removeClass("loading");
						self.createTailorPlug()
					}
				}
			};
			this.createTailorPlug = function() {
				var width = $("#tailorImg")
					.width();
				var height = $("#tailorImg")
					.height();
				var x1 = (width / 2) - (width / 5);
				var y1 = (height / 2) - (height / 5);
				var x2 = (width / 2) + (width / 5);
				var y2 = (height / 2) + (height / 5);
				var api = $.Jcrop("#tailorImg", {
					setSelect: [x1, y1, x2, y2],
					onChange: setCoords,
					onSelect: setCoords
				});

				function setCoords(obj) {
					tailorVal = {
						"leftX": obj.x,
						"leftY": obj.y,
						"rightX": obj.x2,
						"rightY": obj.y2,
						"width": obj.w,
						"height": obj.h
					}
				}
			};
			this.bindPopupEvent = function() {
				var self = this;
				zoom.bind("click", function(event) {
					event.preventDefault();
					if ($(event.target)
						.attr("id") == "zoom") {
						self.closePopup(event)
					}
				});
				$("#zoom .finish")
					.bind("click", function(event) {
						var quondamImgInfo = new Object();
						quondamImgInfo["width"] = $(".jcrop-holder>div>div>img")
							.width();
						quondamImgInfo["height"] = $(".jcrop-holder>div>div>img")
							.height();
						para.onTailor(tailorVal, quondamImgInfo);
						self.closePopup(event)
					});
				$("#zoom .close")
					.bind("click", function(event) {
						self.closePopup(event)
					})
			};
			this.closePopup = function(event) {
				if (event) {
					event.preventDefault()
				}
				zoomedIn = false;
				openedImage = null;
				zoom.hide();
				$("body")
					.removeClass("zoomed");
				zoomContent.empty()
			};
			this.init()
		})
	}
})(jQuery);
var ZYFILE = {
	fileInput: null,
	uploadInput: null,
	dragDrop: null,
	url: "",
	uploadFile: [],
	lastUploadFile: [],
	perUploadFile: [],
	fileNum: 0,
	filterFile: function(files) {
		return files
	},
	onSelect: function(selectFile, files) {},
	onDelete: function(file, files) {},
	onProgress: function(file, loaded, total) {},
	onSuccess: function(file, responseInfo) {},
	onFailure: function(file, responseInfo) {},
	onComplete: function(responseInfo) {},
	funDragHover: function(e) {
		e.stopPropagation();
		e.preventDefault();
		this[e.type === "dragover" ? "onDragOver" : "onDragLeave"].call(e.target);
		return this
	},
	funGetFiles: function(e) {
		var self = this;
		this.funDragHover(e);
		var files = e.target.files || e.dataTransfer.files;
		self.lastUploadFile = this.uploadFile;
		this.uploadFile = this.uploadFile.concat(this.filterFile(files));
		var tmpFiles = [];
		var lArr = [];
		var uArr = [];
		$.each(self.lastUploadFile, function(k, v) {
			lArr.push(v.name)
		});
		$.each(self.uploadFile, function(k, v) {
			uArr.push(v.name)
		});
		$.each(uArr, function(k, v) {
			if ($.inArray(v, lArr) < 0) {
				tmpFiles.push(self.uploadFile[k])
			}
		});
		this.uploadFile = tmpFiles;
		this.funDealtFiles();
		return true
	},
	funDealtFiles: function() {
		var self = this;
		$.each(this.uploadFile, function(k, v) {
			v.index = self.fileNum;
			self.fileNum++
		});
		var selectFile = this.uploadFile;
		this.perUploadFile = this.perUploadFile.concat(this.uploadFile);
		this.uploadFile = this.lastUploadFile.concat(this.uploadFile);
		this.onSelect(selectFile, this.uploadFile);
		console.info("继续选择");
		console.info(this.uploadFile);
		return this
	},
	funDeleteFile: function(delFileIndex, isCb) {
		var self = this;
		var tmpFile = [];
		var delFile = this.perUploadFile[delFileIndex];
		$.each(this.uploadFile, function(k, v) {
			if (delFile != v) {
				tmpFile.push(v)
			}
		});
		this.uploadFile = tmpFile;
		if (isCb) {
			self.onDelete(delFile, this.uploadFile)
		}
		console.info("还剩这些文件没有上传:");
		console.info(this.uploadFile);
		return true
	},
	funUploadFiles: function() {
		var self = this;
		$.each(this.uploadFile, function(k, v) {
			self.funUploadFile(v)
		})
	},
	funUploadFile: function(file) {
		var self = this;
		var formdata = new FormData();
		formdata.append("file", file);
		if ($("#uploadTailor_" + file.index)
			.length > 0) {
			formdata.append("tailor", $("#uploadTailor_" + file.index)
				.attr("tailor"))
		}
		var xhr = new XMLHttpRequest();
		xhr.upload.addEventListener("progress", function(e) {
			self.onProgress(file, e.loaded, e.total)
		}, false);
		xhr.addEventListener("load", function(e) {
			self.funDeleteFile(file.index, false);
			self.onSuccess(file, xhr.responseText);
			if (self.uploadFile.length == 0) {
				self.onComplete("全部完成")
			}
		}, false);
		xhr.addEventListener("error", function(e) {
			self.onFailure(file, xhr.responseText)
		}, false);
		xhr.open("POST", self.url, true);
		xhr.send(formdata)
	},
	funReturnNeedFiles: function() {
		return this.uploadFile
	},
	init: function() {
		var self = this;
		if (this.dragDrop) {
			this.dragDrop.addEventListener("dragover", function(e) {
				self.funDragHover(e)
			}, false);
			this.dragDrop.addEventListener("dragleave", function(e) {
				self.funDragHover(e)
			}, false);
			this.dragDrop.addEventListener("drop", function(e) {
				self.funGetFiles(e)
			}, false)
		}
		if (self.fileInput) {
			this.fileInput.addEventListener("change", function(e) {
				self.funGetFiles(e)
			}, false)
		}
		if (self.uploadInput) {
			this.uploadInput.addEventListener("click", function(e) {
				self.funUploadFiles(e)
			}, false)
		}
	}
};
(function($, undefined) {
	$.fn.zyUpload = function(options, param) {
		var otherArgs = Array.prototype.slice.call(arguments, 1);
		if (typeof options == "string") {
			var fn = this[0][options];
			if ($.isFunction(fn)) {
				return fn.apply(this, otherArgs)
			} else {
				throw ("zyUpload - No such method: " + options)
			}
		}
		return this.each(function() {
			var para = {};
			var self = this;
			var defaults = {
				width: "700px",
				height: "400px",
				itemWidth: "140px",
				itemHeight: "120px",
				url: "/upload/UploadAction",
				fileType: [],
				fileSize: 51200000,
				multiple: true,
				dragDrop: true,
				tailor: false,
				del: true,
				finishDel: false,
				onSelect: function(selectFiles, allFiles) {},
				onDelete: function(file, files) {},
				onSuccess: function(file, response) {},
				onFailure: function(file, response) {},
				onComplete: function(response) {}
			};
			para = $.extend(defaults, options);
			this.init = function() {
				this.createHtml();
				this.createCorePlug()
			};
			this.createHtml = function() {
				var multiple = "";
				para.multiple ? multiple = "multiple" : multiple = "";
				var html = "";
				if (para.dragDrop) {
					html += '<form id="uploadForm" action="' + para.url + '" method="post" enctype="multipart/form-data">';
					html += '	<div class="upload_box">';
					html += '		<div class="upload_main">';
					html += '			<div class="upload_choose">';
					html += '				<div class="convent_choice">';
					html += '					<div class="andArea">';
					html += '						<div class="filePicker">点击选择文件</div>';
					html += '						<input id="fileImage" type="file" size="30" name="fileselect[]" ' + multiple + ">";
					html += "					</div>";
					html += "				</div>";
					html += '				<span id="fileDragArea" class="upload_drag_area">或者将文件拖到此处</span>';
					html += "			</div>";
					html += '			<div class="status_bar">';
					html += '				<div id="status_info" class="info">选中0张文件，共0B。</div>';
					html += '				<div class="btns">';
					html += '					<div class="webuploader_pick">继续选择</div>';
					html += '					<div class="upload_btn">开始上传</div>';
					html += "				</div>";
					html += "			</div>";
					html += '			<div id="preview" class="upload_preview"></div>';
					html += "		</div>";
					html += '		<div class="upload_submit">';
					html += '			<button type="button" id="fileSubmit" class="upload_submit_btn">确认上传文件</button>';
					html += "		</div>";
					html += '		<div id="uploadInf" class="upload_inf"></div>';
					html += "	</div>";
					html += "</form>"
				} else {
					var imgWidth = parseInt(para.itemWidth.replace("px", "")) - 15;
					html += '<form id="uploadForm" action="' + para.url + '" method="post" enctype="multipart/form-data">';
					html += '	<div class="upload_box">';
					html += '		<div class="upload_main single_main">';
					html += '			<div class="status_bar">';
					html += '				<div id="status_info" class="info">选中0张文件，共0B。</div>';
					html += '				<div class="btns">';
					html += '					<input id="fileImage" type="file" size="30" name="fileselect[]" ' + multiple + ">";
					html += '					<div class="webuploader_pick">选择文件</div>';
					html += '					<div class="upload_btn">开始上传</div>';
					html += "				</div>";
					html += "			</div>";
					html += '			<div id="preview" class="upload_preview">';
					html += '				<div class="add_upload">';
					html += '					<a style="height:' + para.itemHeight + ";width:" + para.itemWidth + ';" title="点击添加文件" id="rapidAddImg" class="add_imgBox" href="javascript:void(0)">';
					html += '						<div class="uploadImg" style="width:' + imgWidth + 'px">';
					html += '							<img class="upload_image" src="zyupload/skins/images/add_img.png" style="width:expression(this.width > ' + imgWidth + " ? " + imgWidth + 'px : this.width)" />';
					html += "						</div>";
					html += "					</a>";
					html += "				</div>";
					html += "			</div>";
					html += "		</div>";
					html += '		<div class="upload_submit">';
					html += '			<button type="button" id="fileSubmit" class="upload_submit_btn">确认上传文件</button>';
					html += "		</div>";
					html += '		<div id="uploadInf" class="upload_inf"></div>';
					html += "	</div>";
					html += "</form>"
				}
				$(self)
					.append(html)
					.css({
						"width": para.width,
						"height": para.height
					});
				this.addEvent()
			};
			this.funSetStatusInfo = function(files) {
				var size = 0;
				var num = files.length;
				$.each(files, function(k, v) {
					size += v.size
				});
				if (size > 1024 * 1024) {
					size = (Math.round(size * 100 / (1024 * 1024)) / 100)
						.toString() + "MB"
				} else {
					size = (Math.round(size * 100 / 1024) / 100)
						.toString() + "KB"
				}
				$("#status_info")
					.html("选中" + num + "张文件，共" + size + "。")
			};
			this.funFilterEligibleFile = function(files) {
				var arrFiles = [];
				for (var i = 0, file; file = files[i]; i++) {
					var newStr = file.name.split("").reverse().join("");
					if(ZYFILE.funReturnNeedFiles().length <1){
						if (newStr.split(".")[0] != null) {
							var type = newStr.split(".")[0].split("")
								.reverse()
								.join("");
							if (jQuery.inArray(type, para.fileType) > -1) {
								if (file.size >= para.fileSize) {
									alert('您这个"' + file.name + '"文件大小过大')
								} else {
									arrFiles.push(file)
								}
							} else {
								alert('您这个"' + file.name + '"上传类型不符合')
							}
						} else {
							alert('您这个"' + file.name + '"没有类型, 无法识别')
						}
					}else{
						alert("只能选择一个文件");
					}
				}
				return arrFiles
			};
			this.funDisposePreviewHtml = function(file, e) {
				var html = "";
				var imgWidth = parseInt(para.itemWidth.replace("px", "")) - 15;
				var imgHeight = parseInt(para.itemHeight.replace("px", "")) - 10;
				var editHtml = "";
				var delHtml = "";
				if (para.tailor) {
					editHtml = '<span class="file_edit" data-index="' + file.index + '" title="编辑"></span>'
				}
				if (para.del) {
					delHtml = '<span class="file_del" data-index="' + file.index + '" title="删除"></span>'
				}
				var newStr = file.name.split("")
					.reverse()
					.join("");
				var type = newStr.split(".")[0].split("")
					.reverse()
					.join("");
				var fileImgSrc = "zyupload/skins/images/fileType/";
				if (type == "rar") {
					fileImgSrc = fileImgSrc + "rar.png"
				} else {
					if (type == "zip") {
						fileImgSrc = fileImgSrc + "zip.png"
					} else {
						if (type == "txt") {
							fileImgSrc = fileImgSrc + "txt.png"
						} else {
							if (type == "ppt") {
								fileImgSrc = fileImgSrc + "ppt.png"
							} else {
								if (type == "xls") {
									fileImgSrc = fileImgSrc + "xls.png"
								} else {
									if (type == "pdf") {
										fileImgSrc = fileImgSrc + "pdf.png"
									} else {
										if (type == "psd") {
											fileImgSrc = fileImgSrc + "psd.png"
										} else {
											if (type == "ttf") {
												fileImgSrc = fileImgSrc + "ttf.png"
											} else {
												if (type == "swf") {
													fileImgSrc = fileImgSrc + "swf.png"
												} else {
													fileImgSrc = fileImgSrc + "file.png"
												}
											}
										}
									}
								}
							}
						}
					}
				}
				if (file.type.indexOf("image") == 0) {
					html += '<div id="uploadList_' + file.index + '" class="upload_append_list">';
					html += '	<div class="file_bar">';
					html += '		<div style="padding:5px;">';
					html += '			<p class="file_name" title="' + file.name + '">' + file.name + "</p>";
					html += editHtml;
					html += delHtml;
					html += "		</div>";
					html += "	</div>";
					html += '	<a style="height:' + para.itemHeight + ";width:" + para.itemWidth + ';" href="#" class="imgBox">';
					html += '		<div class="uploadImg" style="width:' + imgWidth + "px;max-width:" + imgWidth + "px;max-height:" + imgHeight + 'px;">';
					html += '			<img id="uploadImage_' + file.index + '" class="upload_image" src="' + e.target.result + '" style="width:expression(this.width > ' + imgWidth + " ? " + imgWidth + 'px : this.width);" />';
					html += "		</div>";
					html += "	</a>";
					html += '	<p id="uploadProgress_' + file.index + '" class="file_progress"></p>';
					html += '	<p id="uploadFailure_' + file.index + '" class="file_failure">上传失败，请重试</p>';
					html += '	<p id="uploadTailor_' + file.index + '" class="file_tailor" tailor="false">裁剪完成</p>';
					html += '	<p id="uploadSuccess_' + file.index + '" class="file_success"></p>';
					html += "</div>"
				} else {
					html += '<div id="uploadList_' + file.index + '" class="upload_append_list">';
					html += '	<div class="file_bar">';
					html += '		<div style="padding:5px;">';
					html += '			<p class="file_name">' + file.name + "</p>";
					html += delHtml;
					html += "		</div>";
					html += "	</div>";
					html += '	<a style="height:' + para.itemHeight + ";width:" + para.itemWidth + ';" href="#" class="imgBox">';
					html += '		<div class="uploadImg" style="width:' + imgWidth + 'px">';
					html += '			<img id="uploadImage_' + file.index + '" class="upload_file" src="' + fileImgSrc + '" style="width:expression(this.width > ' + imgWidth + " ? " + imgWidth + 'px : this.width)" />';
					html += "		</div>";
					html += "	</a>";
					html += '	<p id="uploadProgress_' + file.index + '" class="file_progress"></p>';
					html += '	<p id="uploadFailure_' + file.index + '" class="file_failure">上传失败，请重试</p>';
					html += '	<p id="uploadSuccess_' + file.index + '" class="file_success"></p>';
					html += "</div>"
				}
				return html
			};
			this.createPopupPlug = function(imgSrc, index, name) {
				$("body")
					.zyPopup({
						src: imgSrc,
						index: index,
						name: name,
						onTailor: function(val, quondamImgInfo) {
							var nWidth = parseInt(para.itemWidth.replace("px", ""));
							var nHeight = parseInt(para.itemHeight.replace("px", ""));
							var qWidth = val.width;
							var qHeight = val.height;
							var ratio = nWidth / qWidth;
							var width = ratio * quondamImgInfo.width;
							var height = ratio * quondamImgInfo.height;
							var left = val.leftX * ratio;
							var top = val.rightY * ratio - qHeight * ratio;
							$("#uploadImage_" + index)
								.css({
									"width": width,
									"height": height,
									"margin-left": -left,
									"margin-top": -top
								});
							$("#uploadTailor_" + index)
								.show();
							console.info(val);
							var tailor = "{'leftX':" + val.leftX + ",'leftY':" + val.leftY + ",'rightX':" + val.rightX + ",'rightY':" + val.rightY + ",'width':" + val.width + ",'height':" + val.height + "}";
							$("#uploadTailor_" + index)
								.attr("tailor", tailor)
						}
					})
			};
			this.createCorePlug = function() {
				var params = {
					fileInput: $("#fileImage")
						.get(0),
					uploadInput: $("#fileSubmit")
						.get(0),
					dragDrop: $("#fileDragArea")
						.get(0),
					url: $("#uploadForm")
						.attr("action"),
					filterFile: function(files) {
						return self.funFilterEligibleFile(files)
					},
					onSelect: function(selectFiles, allFiles) {
						para.onSelect(selectFiles, allFiles);
						self.funSetStatusInfo(ZYFILE.funReturnNeedFiles());
						var html = "",
							i = 0;
						var funDealtPreviewHtml = function() {
							file = selectFiles[i];
							if (file) {
								var reader = new FileReader();
								reader.onload = function(e) {
									html += self.funDisposePreviewHtml(file, e);
									i++;
									funDealtPreviewHtml()
								};
								reader.readAsDataURL(file)
							} else {
								funAppendPreviewHtml(html)
							}
						};
						var funAppendPreviewHtml = function(html) {
							if (para.dragDrop) {
								$("#preview")
									.append(html)
							} else {
								$(".add_upload")
									.before(html)
							}
							funBindDelEvent();
							funBindHoverEvent()
						};
						var funBindDelEvent = function() {
							if ($(".file_del")
								.length > 0) {
								$(".file_del")
									.click(function() {
										ZYFILE.funDeleteFile(parseInt($(this)
											.attr("data-index")), true);
										return false
									})
							}
							if ($(".file_edit")
								.length > 0) {
								$(".file_edit")
									.click(function() {
										var imgIndex = $(this)
											.attr("data-index");
										var imgName = $(this)
											.prev(".file_name")
											.attr("title");
										var imgSrc = $("#uploadImage_" + imgIndex)
											.attr("src");
										self.createPopupPlug(imgSrc, imgIndex, imgName);
										return false
									})
							}
						};
						var funBindHoverEvent = function() {
							$(".upload_append_list")
								.hover(function(e) {
									$(this)
										.find(".file_bar")
										.addClass("file_hover")
								}, function(e) {
									$(this)
										.find(".file_bar")
										.removeClass("file_hover")
								})
						};
						funDealtPreviewHtml()
					},
					onDelete: function(file, files) {
						para.onDelete(file, files);
						$("#uploadList_" + file.index)
							.fadeOut();
						self.funSetStatusInfo(files);
						console.info("剩下的文件");
						console.info(files)
					},
					onProgress: function(file, loaded, total) {
						var eleProgress = $("#uploadProgress_" + file.index),
							percent = (loaded / total * 100)
							.toFixed(2) + "%";
						if (eleProgress.is(":hidden")) {
							eleProgress.show()
						}
						eleProgress.css("width", percent)
					},
					onSuccess: function(file, response) {
						para.onSuccess(file, response);
						$("#uploadProgress_" + file.index)
							.hide();
						$("#uploadSuccess_" + file.index)
							.show();
						if (para.finishDel) {
							$("#uploadList_" + file.index)
								.fadeOut();
							self.funSetStatusInfo(ZYFILE.funReturnNeedFiles())
						}
						if ($("#uploadTailor_" + file.index)
							.length > 0) {
							$("#uploadTailor_" + file.index)
								.hide()
						}
					},
					onFailure: function(file, response) {
						para.onFailure(file, response);
						$("#uploadProgress_" + file.index)
							.hide();
						$("#uploadSuccess_" + file.index)
							.show();
						if ($("#uploadTailor_" + file.index)
							.length > 0) {
							$("#uploadTailor_" + file.index)
								.hide()
						}
						$("#uploadInf")
							.append("<p>文件" + file.name + "上传失败！</p>")
					},
					onComplete: function(response) {
						para.onComplete(response);
						console.info(response)
					},
					onDragOver: function() {
						$(this)
							.addClass("upload_drag_hover")
					},
					onDragLeave: function() {
						$(this)
							.removeClass("upload_drag_hover")
					}
				};
				ZYFILE = $.extend(ZYFILE, params);
				ZYFILE.init()
			};
			this.addEvent = function() {
				if ($(".filePicker")
					.length > 0) {
					$(".filePicker")
						.bind("click", function(e) {
							$("#fileImage")
								.click()
						})
				}
				$(".webuploader_pick")
					.bind("click", function(e) {
						$("#fileImage")
							.click()
					});
				$(".upload_btn")
					.bind("click", function(e) {
						if (ZYFILE.funReturnNeedFiles()
							.length > 0) {
							$("#fileSubmit")
								.click()
						} else {
							alert("请先选中文件再点击上传")
						}
					});
				if ($("#rapidAddImg")
					.length > 0) {
					$("#rapidAddImg")
						.bind("click", function(e) {
							$("#fileImage")
								.click()
						})
				}
			};
			this.init()
		})
	}
})(jQuery);